home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.whtech.com
/
ftp.whtech.com.tar
/
ftp.whtech.com
/
datasheets and manuals
/
Hardware
/
WHT
/
scsi
/
dsr_sources_2_2001
/
getddr
< prev
next >
Wrap
Text File
|
2006-10-19
|
12KB
|
476 lines
* Function GETDDR - GET Directory Descriptor Record
*
* This function will take the name of the file in the
* FCN (Filename Compare Buffer) and get the DDR of the
* directory the file is named in. If it is already in
* memory, it will set R5 to point to the DDR. If it
* is not already in memory, it will read it from the
* disk. If it cannot read it from the disk for any reason,
* it will return a 0 in R5.
*
* Register Usage:
* R5 - points to DDR in memory
* R10 - Flag to indicate if we found the directory we
* want or a higher level directory
*
* Output:
* R5 - Points to the ddr in RAM bank 3
* R5 = 0 if the DDR is not found
* SAVEAU - contains the AU of the ddr
*
GETDDR CLR R10 Set flag for directory
ANDI R12,>FF00 Make sure R12 is base CRU address
AI R12,24
LDCR @B04,4 Select RAM bank 4
LI R2,NCB+40 Search for last period '.'
GDDR2 DEC R2
CI R2,NCB-1 If there are no periods,
JEQ GDDR3 then we have to read the VIB
CB *R2,@PERIOD
JNE GDDR2
* Now search all subdirectory names in the cache for a match
*
GDDR3
BLWP @FDDR
JEQ GDDR10
* The directory name is not in cache. We will have to try
* the next higher level directory.
*
SETO R10
CI R2,NCB-1 See if we have to read the VIB
JNE GDDR2
* OK, we will have to read in the VIB.
*
CLR R7 Select sector #0
CLR R8
LDCR @ZERO,4 Select RAM bank 0
BLWP @BANKIT
DATA SCSIRD
JEQ GDDR4
AI R8,16 Try reading the copy
BLWP @BANKIT
DATA SCSIRD
JEQ GDDR4
CLR R5 An error occurred
RT
GDDR4 LI R5,SECBUF Store the volume label in our table
MOV R6,R7
SRL R7,8
MPY @TEN,R7
AI R8,DLTABL
GDDR4A MOV *R5+,R7
LDCR @B02,4
MOV R7,*R8+
LDCR @ZERO,4
CI R5,SECBUF+10
JNE GDDR4A
LDCR @B04,4 Select RAM bank 4
BLWP @RESDCE Reserve a Directory Cache Entry
* Now R4 points to DCE
* R5 points to DDR
* Set up Directory cache entry
*
MOVB R6,*R4+ Put in SCSI ID
MOVB @B03,*R4+ Put in RAM bank of DDR
MOV R5,*R4+ Put in DDR address
AI R4,40 Blank out the name
CLR *R4+ Set AU to 0
SETO *R4 Set age to -1 so it doesn't get swapped out
* Now copy the VIB to the DDR cache
*
LI R1,SECBUF SCSI buffer address
LI R0,256
GDDR6 LDCR @ZERO,4 Select RAM bank 0
MOV *R1+,R2
LDCR @B03,4 Select RAM bank 3
MOV R2,*R5+
DECT R0
JNE GDDR6
AI R5,-256 Now get the Sectors/AU from the VIB
MOV @10(R5),R0 Get disk size
MOV @16(R5),R5
SRL R5,12
INC R5
LDCR @B04,4 Select RAM bank 4
MOV R6,R4
SRL R4,8
SLA R4,1
MOV R5,@SAUTBL(R4)
MOV R0,@DSZTBL(R4)
B @GETDDR Now try it again
************************************************************
*
* Here is where we have to look at subdirectory names to
* get the next DDR. Unless of course, we have the DDR we
* want.
*
GDDR10 MOV @44(R4),@SAVEAU
MOV @2(R4),R5 See if DDR is in memory
JNE GDDR16
MOV @44(R4),R7 OK, we need to read it into memory
LI R3,SECBUF Pointer to SCSI buffer
MOV R6,R5 Get AU of DDR
SRL R5,8
SLA R5,1
MPY @SAUTBL(R5),R7 Multiply AU by Sectors/AU
SRL R8,1 Divide by 2
JNC GDDR11
AI R3,>100 We will use last 256 bytes
GDDR11 SRL R7,1
JNC GDDR12
AI R8,>8000
GDDR12 BLWP @BANKIT Read the DDR from the drive
DATA SCSIRD
JEQ GDDR14
CLR R5 Error, return a zero
RT
* Copy the 256 byte sector from the SCSI buffer to the
* DDR cache
GDDR14 LDCR @B04,4 Select RAM bank 4
BLWP @FREDCE
LI R1,256
GDDR15 LDCR @ZERO,4 Select RAM bank 0
MOV *R3+,R7
LDCR @B03,4 Select RAM bank 3
MOV R7,*R5+
DECT R1
JNE GDDR15
AI R5,-256 Restore pointer
GDDR16 CI R10,0 See if we are done
JNE GDDR17
LDCR @B04,4 Update age if necessary
C @46(R4),@>5FFE
JH GDR16A
JEQ GDR16A
INC @>5FFE
MOV @>5FFE,@46(R4)
GDR16A
RT
* Move the directory name to the file name compare buffer in bank 0.
*
GDDR17 INC R2
LI R3,FNCB
GDDR18 LDCR @B04,4 Select RAM bank 4
CB *R2,@PERIOD
JEQ GDR18A
MOVB *R2+,R4
LDCR @ZERO,4 Select RAM bank 0
MOVB R4,*R3+
JMP GDDR18
GDR18A LDCR @ZERO,4
GDDR19 CI R3,FNCB+10 See if we need to pad with spaces
JEQ GDDR20
MOVB @SPACE,*R3+
JMP GDDR19
* Now start reading directory names
*
* We do a binary search of the subdirectory names in the DDR
*
GDDR20 LDCR @B04,4 Select RAM bank 4
MOV R6,R3 Get the number of sectors/AU for this device
SRL R3,8
SLA R3,1
MOV @SAUTBL(R3),R3
LDCR @B03,4 Select RAM bank 3
CLR R0 R0 points to lower bound of subdirectories
MOVB @23(R5),R1 Get the number of subdirectories
JNE GDDR21 If this directory has no subdirectories,
GDDERR CLR R5 then return a null pointer
RT
GDDR21 SRL R1,8
DEC R1
GDDR22 LDCR @B03,4 Select RAM bank 3
MOV R0,R10 Calculate the midpoint
A R1,R10
ANDI R10,>FFFE
A R5,R10
MOV @28(R10),R7 Get AU of subdirectory we want to check
LDCR @B04,4 Select RAM bank 4
MOV R7,@SAVEAU Save the AU to put in the cache entry
MPY R3,R7 convert AU to SCSI sector
LI R4,SECBUF R4 points to SCSI buffer
SRL R8,1
JNC GDDR23
AI R4,>0100 Read upper 256 bytes of 512 byte buffer
GDDR23 SRL R7,1
JNC GDDR24
AI R8,>8000
GDDR24 LDCR @ZERO,4 Select ram bank 0
BLWP @BANKIT Read DDR from SCSI drive
DATA SCSIRD
JNE GDDERR Branch if there was a read error
* Now compare the directory name to the one in the FNCB
*
LI R7,FNCB
LI R9,10
GDDR25 C *R4+,*R7+
JH GDDR28
JL GDDR29
DECT R9
JNE GDDR25
* We have a match - reserve a DCE and copy the DDR
*
AI R4,-10 Restore pointer to DDR in SCSI buffer
MOV R4,R7 Save pointer
LDCR @B04,4 Select RAM bank 4
BLWP @RESDCE
* Now fill in the Directory Name Cache Entry
*
MOVB R6,*R4+ Store SCSI ID
MOVB @B03,*R4+ Put in RAM bank of the DDR
MOV R5,*R4+ Put in the DDR address
* Now fill in the name of the directory
*
MOV R4,R3
LI R1,NCB
GDDR26 MOVB *R1+,*R3+
C R1,R2
JNE GDDR26
* Put in the AU
*
MOV @SAVEAU,@40(R4)
* And finally put in the age to complete the entry
*
INC @>5FFE
MOV @>5FFE,@42(R4)
* Now copy the DDR
*
LI R1,256
GDDR27 LDCR @ZERO,4 Select RAM bank 0
MOV *R7+,R8
LDCR @B03,4 Select RAM bank 3
MOV R8,*R5+
DECT R1
JNE GDDR27
* Now since we've destroyed R5 and R10, just go back to
* the beginning of the subroutine. We'll find this
* directory in cache, so it shouldn't take very long.
*
B @GETDDR
* If the names didn't match, select another directory name
* to search. If there are none left, return a null pointer.
*
GDDR28 C R0,R1
JEQ GDDERR
MOV R0,R10
A R1,R10
SRL R10,1
C R10,R0
JEQ GDDERR
MOV R10,R1
DEC R1
JMP GDDR22
GDDR29 C R0,R1
JEQ GDDERR
MOV R0,R10
A R1,R10
SRL R10,1
MOV R10,R0
INC R0
JMP GDDR22
************************************************************
*
* Function GETFDR
*
* This function will try to get the File Descriptor Record
* of the file specified in the name compare buffer. If it
* is successful, it will copy the FDR into the SCSI buffer
* and return a pointer to it.
*
* Output:
* R5 points to FDR in RAM bank 0 if found
* R5 = 0 if FDR not found
* SAVEAU contains the AU of the FDR on disk
*
**********************************************************
GETFDR ANDI R12,>FF00
AI R12,24
LDCR @B02,4 Select RAM bank 2
MOV R11,@GFDRRT Save return address
BL @GETDDR Get the DDR first
CI R5,0
JEQ GFDR98
* Check to make sure the number of files in the directory
* does not equal zero.
LDCR @B03,4 Select RAM bank 3
MOVB @22(R5),R1 Get the number of files
JEQ GFDR98
* Read the file index and store it in DFDR
*
MOV @24(R5),R7 Get AU of the file index
LDCR @B04,4
MOV R6,R3
SRL R3,8
SLA R3,1
MPY @SAUTBL(R3),R7
LI R5,SECBUF Point to SCSI buffer
SRL R8,1
JNC GFDR1
AI R5,>100
GFDR1 SRL R7,1
JNC GFDR2
AI R8,>8000
GFDR2 LDCR @ZERO,4
BLWP @BANKIT Read the index from disk
DATA SCSIRD
JNE GFDR98
* Copy the filename to the filename compare buffer (FNCB)
*
LDCR @B02,4 Select RAM bank 2
LI R2,NCB+39
GFDR3 CB *R2,@PERIOD
JEQ GFDR4
DEC R2
CI R2,NCB-1
JNE GFDR3
GFDR4 INC R2
LI R4,FNCB
GFDR5 CI R2,NCB+40
JEQ GFDR6
CB *R2,@SPACE
JEQ GFDR6
MOVB *R2+,R3
LDCR @ZERO,4
MOVB R3,*R4+
LDCR @B02,4
JMP GFDR5
GFDR6 LDCR @ZERO,4 Pad the rest of the name with spaces
GFDR6A CI R4,FNCB+10
JEQ GFDR7
MOVB @SPACE,*R4+
JMP GFDR6A
* Here is where we return to the calling program
*
GFDR98 CLR R5 We did not find the FDR
GFDR99 LDCR @B02,4 Select RAM bank 2
MOV @GFDRRT,R11 Get our return address
RT
GFDR7
* set the bounds for our binary search
*
SRL R1,8
CLR R0
* Copy the file index from the SCSI buffer to DFDR
*
LI R2,DFDR
MOV R1,R3
DEC R1
GFDR8 LDCR @ZERO,4
MOV *R5+,R4
LDCR @B02,4
MOV R4,*R2+
DEC R3
JNE GFDR8
GFDR9 LDCR @B02,4
MOV R0,R2 Calculate the midpoint for the
A R1,R2 binary search
ANDI R2,>FFFE
MOV @DFDR(R2),R7 Get AU of FDR we want to check
LDCR @B04,4 Select RAM bank 4
MOV R7,@SAVEAU Save the AU in case this is the one
MOV R6,R3
SRL R3,8
SLA R3,1
MPY @SAUTBL(R3),R7
LDCR @ZERO,4
LI R5,SECBUF
SRL R8,1
JNC GFDR10
AI R5,>100
GFDR10 SRL R7,1
JNC GFDR11
AI R8,>8000
GFDR11 BLWP @BANKIT Read the FDR from disk
DATA SCSIRD
JNE GFDR98
* Now compare the filename
*
LI R3,FNCB
GFDR12 C *R5+,*R3+
JL GFDR13
JH GFDR14
CI R3,FNCB+10
JNE GFDR12
AI R5,-10 We found it!!!
JMP GFDR99
* The file name did not match. Modify the bounds
* of our binary search
*
GFDR13 C R0,R1 Is there anything left to check?
JEQ GFDR98 If not, error
MOV R0,R2 Recompute the midpoint
A R1,R2
SRL R2,1
MOV R2,R0 Modify lower bound of the search
INC R0
JMP GFDR9
GFDR14 C R0,R1 Is there anything left to check?
JEQ GFDR98 If not, error
MOV R0,R2 Recompute the midpoint
A R1,R2
SRL R2,1
C R2,R0
JEQ GFDR98
MOV R2,R1 Modify the upper bound of the search
DEC R1
JMP GFDR9